#include "Queue.h"
using namespace std;

//初始化
void QueueInit(Queue*& pq)
{
    pq->headptr=pq->tailptr=nullptr;
    pq->size=0;
}

//销毁
void QueueDestroy(Queue*& pq)
{
    assert(pq);
    QNode* cur=pq->headptr;
    while(cur)
    {
        QNode* next=cur->next;
        free(cur);
        cur=next;
    }
    pq->headptr=pq->tailptr=nullptr;
    pq->size=0;
}

// 队尾插入
void QueuePush(Queue*& pq, QueueElement x)
{
    assert(pq);
    QNode* newnode=new QNode;
    if(!newnode)
    {
        cerr<<"new failed"<<endl;
    }
    newnode->next=nullptr;
    newnode->QueueValue=x;
    if(pq->tailptr==nullptr)
    {
        pq->headptr=pq->tailptr=newnode;
    }
    else
    {
        //原来队尾指针指向新元素
        pq->tailptr->next=newnode;
        //更改队尾指针的指向
        pq->tailptr=newnode;
    }
    pq->size++;
}

// 队头删除
void QueuePop(Queue*& pq)
{
    assert(pq&&pq->size);
    if(pq->headptr->next==nullptr)
    {
        free(pq->headptr);
        pq->headptr=pq->tailptr=nullptr;
    }
    else
    {
        QNode* next=pq->headptr->next;
        free(pq->headptr);
        pq->headptr=next;
    }
    pq->size--;
}

// 取队头和队尾的数据
QueueElement QueueFront(Queue* pq)
{
    assert(pq);
    return pq->headptr->QueueValue;
}

QueueElement QueueBack(Queue* pq)
{
    assert(pq);
    return pq->tailptr->QueueValue;
}

//队列中的数据个数
int QueueSize(Queue* pq)
{
    assert(pq);
    return pq->size;
}

//判断队列是否为空
bool QueueEmpty(Queue* pq)
{
    assert(pq);
    return pq->size==0;
}

//输出队列元素
void QueuePrint(Queue* pq)
{
    assert(pq);
    QNode*cur=pq->headptr;
    while(cur)
    {
        cout<<cur->QueueValue;
        cur=cur->next;
    }
    cout<<endl;
}


void test()
{
    Queue* q=nullptr;
    QueueInit(q);
    QueuePush(q,1);
    QueuePush(q,2);
    QueuePush(q,3);
    QueuePush(q,4);
    QueuePush(q,5);
    // cout<<q->size<<endl;
    cout<<"hello";
}

int main()
{
    test();
    // for(int i=0;i<10;i++)
    // {
    //     i+=1;
    //     [i]()
    //     {
    //         cout<<i<<"i"<<endl;
    //     }
    //     ();
    // }
    cout<<"hello";
    return 0;
}
